package edu.sias.article.service.impl;

import edu.sias.article.entity.Article;
import edu.sias.article.entity.Comment;
import edu.sias.article.mapper.ArticleMapper;
import edu.sias.article.mapper.CommentMapper;
import edu.sias.article.service.ArticleService;
import edu.sias.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

/**
 * 文章服务接口的实现类，使用 @Service 注解标记为 Spring 服务组件
 */
@Service
public class ArticleServiceImpl implements ArticleService {
    /**
     * 自动注入 ArticleMapper 实例，用于文章的数据库操作
     */
    @Autowired
    private ArticleMapper articleMapper;
    /**
     * 自动注入 CommentMapper 实例，用于评论的数据库操作
     */
    @Autowired
    private CommentMapper commentMapper;

    /**
     * 实现创建文章的业务逻辑，调用 ArticleMapper 的 insertArticle 方法
     * @param article 要创建的文章对象
     * @return 创建成功后的文章对象
     */
    @Override
    public Article createArticle(Article article) {
        Long userId = SecurityUtils.getUserId();
        article.setUserId(userId);
        articleMapper.insertArticle(article);
        return article;
    }

    /**
     * 实现获取所有文章的业务逻辑，调用 ArticleMapper 的 getAllArticles 方法
     * @return 包含所有文章的列表
     */
    @Override
    public List<Article> getArticles() {
        return articleMapper.getAllArticles();
    }

    /**
     * 实现根据文章 ID 获取文章的业务逻辑，调用 ArticleMapper 的 getArticleById 方法
     * @param id 文章的唯一标识符
     * @return 包含文章对象的 Optional，若文章不存在则 Optional 为空
     */
    @Override
    public Optional<Article> getArticleById(Long id) {
        Article article = articleMapper.getArticleById(id);
        return Optional.ofNullable(article);
    }

    /**
     * 实现更新文章的业务逻辑，调用 ArticleMapper 的 updateArticle 方法
     * @param id 要更新的文章的 ID
     * @param updatedArticle 包含更新信息的文章对象
     * @return 包含更新后文章对象的 Optional，若文章不存在则 Optional 为空
     */
    @Override
    public Optional<Article> updateArticle(Long id, Article updatedArticle) {
        Article article = articleMapper.getArticleById(id);
        if (article != null) {
            updatedArticle.setId(id);
            articleMapper.updateArticle(updatedArticle);
            return Optional.of(updatedArticle);
        }
        return Optional.empty();
    }

    /**
     * 实现删除文章的业务逻辑，调用 ArticleMapper 的 deleteArticle 方法
     * @param id 要删除的文章的 ID
     */
    @Override
    public void deleteArticle(Long id) {
        articleMapper.deleteArticle(id);
    }

    /**
     * 实现为文章添加评论的业务逻辑，先根据 ID 查找文章，若存在则添加评论并保存
     *
     * @param id             文章的 ID
     * @param commentContent 评论的内容
     * @param currentUserId
     * @return 包含添加评论后文章对象的 Optional，若文章不存在则 Optional 为空
     */
    @Override
    public Optional<Article> addCommentToArticle(Long id, String commentContent, Long currentUserId) {
        Article article = articleMapper.getArticleById(id);
        if (article != null) {
            Comment comment = new Comment(commentContent);
            comment.setArticleId(id);
            comment.setUserId(currentUserId);
            commentMapper.insertComment(comment);
            article.addComment(comment);
            return Optional.of(article);
        }
        return Optional.empty();
    }
}    